package chat_server;

// -----------------------------------------------------------------------------
// Importanweisungen
import for_all.Message;
import for_all.PopUp;
import for_all.User;
import for_all.User.UserStati;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Vector;


public final class ServerGui extends javax.swing.JFrame {
    
    // -------------------------------------------------------------------------
    // Variablendeklarationen
    private Vector<User> userList;
    private Vector<String> roomList;
    public Server server;
    
    
    // -------------------------------------------------------------------------
    // Konstruktor
    public ServerGui() {
        
        initComponents();
        this.userList = new Vector();
        this.roomList = new Vector();
        
        // GUI-Initial:
        this.panelBenutzer.setVisible(false);
        this.listBenutzer.setCellRenderer(new UserListCellRenderer());        
    }
    
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        buttonGroup2 = new javax.swing.ButtonGroup();
        buttonGroup3 = new javax.swing.ButtonGroup();
        buttonGroup4 = new javax.swing.ButtonGroup();
        buttonGroup5 = new javax.swing.ButtonGroup();
        buttonGroup6 = new javax.swing.ButtonGroup();
        scrollPaneProtokoll = new javax.swing.JScrollPane();
        textAreaProtokoll = new javax.swing.JTextArea();
        tabbedPaneRäumeBenutzer = new javax.swing.JTabbedPane();
        scrollPaneRäume = new javax.swing.JScrollPane();
        listRäume = new javax.swing.JList();
        scrollPaneBenutzer = new javax.swing.JScrollPane();
        listBenutzer = new javax.swing.JList();
        panelBenutzer = new javax.swing.JPanel();
        panelBenutzerDetails = new javax.swing.JPanel();
        labelBenutzerName = new java.awt.Label();
        labelBenutzerRaum = new java.awt.Label();
        textFieldBenutzerRaum = new java.awt.TextField();
        textFieldBenutzerName = new java.awt.TextField();
        labelBenutzerStatus = new java.awt.Label();
        textFieldBenutzerStatus = new java.awt.TextField();
        panelBenutzerAktion = new javax.swing.JPanel();
        comboBoxBenutzerAktion = new javax.swing.JComboBox();
        buttonBenutzerAktion = new javax.swing.JButton();
        panelRaum = new javax.swing.JPanel();
        panelRaumDetails = new javax.swing.JPanel();
        labelRaumAnzahlBenutzer = new javax.swing.JLabel();
        textFieldRaumAnzahlBenutzer = new javax.swing.JTextField();
        textFieldRaumName = new java.awt.TextField();
        labelRaumName = new java.awt.Label();
        panelRaumAktion = new javax.swing.JPanel();
        radioButtonRaumErstellen = new javax.swing.JRadioButton();
        radioButtonRaumLöschen = new javax.swing.JRadioButton();
        radioButtonRaumUmbenennen = new javax.swing.JRadioButton();
        labelRaumNeuerName = new javax.swing.JLabel();
        textFieldNeuerName = new javax.swing.JTextField();
        buttonRaumAktion = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Einhornchatsystem");
        setMinimumSize(new java.awt.Dimension(965, 669));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        textAreaProtokoll.setEditable(false);
        textAreaProtokoll.setColumns(20);
        textAreaProtokoll.setRows(5);
        textAreaProtokoll.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Protokoll", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP));
        scrollPaneProtokoll.setViewportView(textAreaProtokoll);

        tabbedPaneRäumeBenutzer.setMinimumSize(new java.awt.Dimension(410, 403));
        tabbedPaneRäumeBenutzer.setName("Status"); // NOI18N
        tabbedPaneRäumeBenutzer.setPreferredSize(new java.awt.Dimension(410, 158));
        tabbedPaneRäumeBenutzer.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                tabbedPaneRäumeBenutzerStateChanged(evt);
            }
        });

        listRäume.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                listRäumeValueChanged(evt);
            }
        });
        scrollPaneRäume.setViewportView(listRäume);

        tabbedPaneRäumeBenutzer.addTab("Räume", scrollPaneRäume);

        listBenutzer.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                listBenutzerValueChanged(evt);
            }
        });
        scrollPaneBenutzer.setViewportView(listBenutzer);

        tabbedPaneRäumeBenutzer.addTab("Benutzer", scrollPaneBenutzer);

        panelBenutzer.setPreferredSize(new java.awt.Dimension(295, 202));

        panelBenutzerDetails.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Details für Benutzer", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP));

        labelBenutzerName.setAlignment(java.awt.Label.RIGHT);
        labelBenutzerName.setText("Benutzername:");

        labelBenutzerRaum.setAlignment(java.awt.Label.RIGHT);
        labelBenutzerRaum.setText("aktueller Raum:");

        textFieldBenutzerRaum.setEditable(false);

        textFieldBenutzerName.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
        textFieldBenutzerName.setEditable(false);

        labelBenutzerStatus.setAlignment(java.awt.Label.RIGHT);
        labelBenutzerStatus.setText("Status:");

        textFieldBenutzerStatus.setEditable(false);

        javax.swing.GroupLayout panelBenutzerDetailsLayout = new javax.swing.GroupLayout(panelBenutzerDetails);
        panelBenutzerDetails.setLayout(panelBenutzerDetailsLayout);
        panelBenutzerDetailsLayout.setHorizontalGroup(
            panelBenutzerDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBenutzerDetailsLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelBenutzerDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(labelBenutzerRaum, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelBenutzerName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelBenutzerDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelBenutzerDetailsLayout.createSequentialGroup()
                        .addComponent(textFieldBenutzerName, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(labelBenutzerStatus, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(textFieldBenutzerStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addComponent(textFieldBenutzerRaum, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        panelBenutzerDetailsLayout.setVerticalGroup(
            panelBenutzerDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBenutzerDetailsLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelBenutzerDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelBenutzerName, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textFieldBenutzerName, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(labelBenutzerStatus, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textFieldBenutzerStatus, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelBenutzerDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelBenutzerRaum, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textFieldBenutzerRaum, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(11, Short.MAX_VALUE))
        );

        labelBenutzerName.getAccessibleContext().setAccessibleName("");

        panelBenutzerAktion.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Aktionen für Benutzer", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP));

        comboBoxBenutzerAktion.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Normal", "Verwarnen", "Trennen", "Blocken" }));
        comboBoxBenutzerAktion.setInheritsPopupMenu(true);
        comboBoxBenutzerAktion.setMinimumSize(new java.awt.Dimension(350, 20));

        buttonBenutzerAktion.setText("OK");
        buttonBenutzerAktion.setNextFocusableComponent(buttonBenutzerAktion);
        buttonBenutzerAktion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonBenutzerAktionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelBenutzerAktionLayout = new javax.swing.GroupLayout(panelBenutzerAktion);
        panelBenutzerAktion.setLayout(panelBenutzerAktionLayout);
        panelBenutzerAktionLayout.setHorizontalGroup(
            panelBenutzerAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBenutzerAktionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelBenutzerAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(comboBoxBenutzerAktion, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBenutzerAktionLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(buttonBenutzerAktion)))
                .addContainerGap())
        );
        panelBenutzerAktionLayout.setVerticalGroup(
            panelBenutzerAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBenutzerAktionLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(comboBoxBenutzerAktion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(buttonBenutzerAktion)
                .addContainerGap())
        );

        javax.swing.GroupLayout panelBenutzerLayout = new javax.swing.GroupLayout(panelBenutzer);
        panelBenutzer.setLayout(panelBenutzerLayout);
        panelBenutzerLayout.setHorizontalGroup(
            panelBenutzerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
            .addComponent(panelBenutzerDetails, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(panelBenutzerAktion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        panelBenutzerLayout.setVerticalGroup(
            panelBenutzerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBenutzerLayout.createSequentialGroup()
                .addGap(0, 0, 0)
                .addComponent(panelBenutzerDetails, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelBenutzerAktion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        panelRaum.setMaximumSize(new java.awt.Dimension(410, 32767));
        panelRaum.setMinimumSize(new java.awt.Dimension(410, 0));

        panelRaumDetails.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Details für Raum", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP));

        labelRaumAnzahlBenutzer.setText("Anzahl Benutzer");

        textFieldRaumAnzahlBenutzer.setEditable(false);
        textFieldRaumAnzahlBenutzer.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        textFieldRaumName.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
        textFieldRaumName.setEditable(false);

        labelRaumName.setAlignment(java.awt.Label.RIGHT);
        labelRaumName.setText("Raumname:");

        javax.swing.GroupLayout panelRaumDetailsLayout = new javax.swing.GroupLayout(panelRaumDetails);
        panelRaumDetails.setLayout(panelRaumDetailsLayout);
        panelRaumDetailsLayout.setHorizontalGroup(
            panelRaumDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelRaumDetailsLayout.createSequentialGroup()
                .addComponent(labelRaumName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(textFieldRaumName, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(labelRaumAnzahlBenutzer)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(textFieldRaumAnzahlBenutzer, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        panelRaumDetailsLayout.setVerticalGroup(
            panelRaumDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelRaumDetailsLayout.createSequentialGroup()
                .addGroup(panelRaumDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelRaumDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(labelRaumAnzahlBenutzer)
                        .addComponent(textFieldRaumAnzahlBenutzer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelRaumDetailsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(labelRaumName, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(textFieldRaumName, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panelRaumAktion.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Aktionen für Raum", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP));

        buttonGroup1.add(radioButtonRaumErstellen);
        radioButtonRaumErstellen.setSelected(true);
        radioButtonRaumErstellen.setText("Raum erstellen");
        radioButtonRaumErstellen.setNextFocusableComponent(textFieldNeuerName);

        buttonGroup1.add(radioButtonRaumLöschen);
        radioButtonRaumLöschen.setText("Raum löschen");
        radioButtonRaumLöschen.setNextFocusableComponent(buttonRaumAktion);

        buttonGroup1.add(radioButtonRaumUmbenennen);
        radioButtonRaumUmbenennen.setText("Raum umbennen");
        radioButtonRaumUmbenennen.setNextFocusableComponent(textFieldNeuerName);

        labelRaumNeuerName.setText("Name:");

        textFieldNeuerName.setNextFocusableComponent(buttonRaumAktion);

        buttonRaumAktion.setText("OK");
        buttonRaumAktion.setToolTipText("");
        buttonRaumAktion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonRaumAktionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelRaumAktionLayout = new javax.swing.GroupLayout(panelRaumAktion);
        panelRaumAktion.setLayout(panelRaumAktionLayout);
        panelRaumAktionLayout.setHorizontalGroup(
            panelRaumAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelRaumAktionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelRaumAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelRaumAktionLayout.createSequentialGroup()
                        .addComponent(radioButtonRaumErstellen)
                        .addGap(18, 18, 18)
                        .addComponent(radioButtonRaumUmbenennen)
                        .addGap(18, 18, 18)
                        .addComponent(radioButtonRaumLöschen)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(panelRaumAktionLayout.createSequentialGroup()
                        .addComponent(labelRaumNeuerName)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(textFieldNeuerName)
                        .addGap(18, 18, 18)
                        .addComponent(buttonRaumAktion)))
                .addContainerGap())
        );
        panelRaumAktionLayout.setVerticalGroup(
            panelRaumAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelRaumAktionLayout.createSequentialGroup()
                .addGap(0, 0, 0)
                .addGroup(panelRaumAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(radioButtonRaumLöschen)
                    .addComponent(radioButtonRaumErstellen)
                    .addComponent(radioButtonRaumUmbenennen))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelRaumAktionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelRaumNeuerName)
                    .addComponent(buttonRaumAktion)
                    .addComponent(textFieldNeuerName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout panelRaumLayout = new javax.swing.GroupLayout(panelRaum);
        panelRaum.setLayout(panelRaumLayout);
        panelRaumLayout.setHorizontalGroup(
            panelRaumLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelRaumDetails, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(panelRaumAktion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        panelRaumLayout.setVerticalGroup(
            panelRaumLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelRaumLayout.createSequentialGroup()
                .addGap(0, 0, 0)
                .addComponent(panelRaumDetails, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(panelRaumAktion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, 0))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addComponent(scrollPaneProtokoll, javax.swing.GroupLayout.DEFAULT_SIZE, 516, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(panelBenutzer, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE)
                    .addComponent(panelRaum, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(tabbedPaneRäumeBenutzer, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(tabbedPaneRäumeBenutzer, javax.swing.GroupLayout.PREFERRED_SIZE, 269, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(panelRaum, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(panelBenutzer, javax.swing.GroupLayout.PREFERRED_SIZE, 208, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(scrollPaneProtokoll))
                .addGap(14, 14, 14))
        );

        tabbedPaneRäumeBenutzer.getAccessibleContext().setAccessibleName("");

        pack();
    }// </editor-fold>//GEN-END:initComponents
    
    
    //<editor-fold defaultstate="collapsed" desc="GUI - SET-Funktionen">
    
    // -------------------------------------------------------------------------
    // User aktualisieren -> online setzten / offline nehmen
    public void setUser (User usr, boolean notification) {
        User selected = null;
        if(listBenutzer.getSelectedIndex() != -1) {
            selected = userList.elementAt(listBenutzer.getSelectedIndex());
        }
        
        
        // Raum gewechselt/online gekommen oder offline gegangen?
        if (usr.getOnline()) {
                
            if(selected != null && usr.getUserName().compareTo(getUserNameFromListEntry(selected.getUserName())) == 0) {
                selected = usr;
                
                textFieldBenutzerRaum.setText(usr.getRoomName());
            }
            
            this.userList.remove(usr);
            this.userList.add(usr);
            if (!"--null--".equals(usr.getRoomName())) {
                this.setMessage(new Message( usr.getUserName()+ " ist in den Raum " + usr.getRoomName() + " gegangen.", "Admin", "Server", false));
            } else {
                if (notification) {
                    this.setMessage(new Message( usr.getUserName() + " ist nun online.", "Admin", "Server", false));
                }
            }
               
        } else {
                
            this.userList.remove(usr);
            this.userList.add(usr);
                
            // Message in ServerProtokoll schreiben
            if (notification) {
                this.setMessage(new Message( usr.getUserName() + " ist nun offline.", "Admin", "Server", false));
            }
        }
        
        // Vektor sortieren -> Name
        Collections.sort(this.userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                
                return o1.getUserName().compareTo(o2.getUserName());
            }
        });
        
        // Vektor sortieren -> Raum (Collections.sort ist stabil ;))
        Collections.sort(this.userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                
                return o1.getRoomName().compareTo(o2.getRoomName());
            }
        });
        
        // Vektor sortieren -> online/offline (Collections.sort ist stabil ;))
        Collections.sort(this.userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                if (o1.getOnline() && o2.getOnline() || !o1.getOnline() && !o2.getOnline()) {
                    return 0;
                } else {
                    if (!o1.getOnline() && o2.getOnline()) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
            }
        });
        
        // jList updaten
        this.listBenutzer.setListData(this.userList);
        if(selected != null) {
//            User temp = new User(getUserNameFromListEntry(selected), "dummy");
//            temp.setRoom(getRoomNameFromListEntry(selected));
//            int test = userList.indexOf(temp);
            listBenutzer.setSelectedValue(selected, true);
        }
        this.listBenutzer.revalidate();
    }
    
    
    // -------------------------------------------------------------------------
    // Liefert Username aus Listeneintrag zurück
    private String getUserNameFromListEntry(String listEntry) {
        if(!listEntry.contains("[")) {
            return listEntry;
        }
        else {
            return listEntry.substring(0, listEntry.lastIndexOf("[")-1);
        }//In der Liste aller Benutzer sind raumname und username durch tab getrennt
    }
    
    // -------------------------------------------------------------------------
    // Liefert Raumname aus Listeneintrag zurück
    private String getRoomNameFromListEntry(String listEntry) {
        if(!listEntry.contains("[")) {
            return "";
        }
        else {
            return listEntry.substring(listEntry.indexOf("[", 0)+1, listEntry.length()-1);
        }
    }
    
    // -------------------------------------------------------------------------
    // Message in Protokoll absetzten
    public void setMessage (Message mes) {
       
       // Message hinzufügen
       if (this.textAreaProtokoll.getText().equals("")) {
           this.textAreaProtokoll.setText("[" + mes.getRoomName() + "] " + mes.getMessage());
       } else {
           this.textAreaProtokoll.append("\n" + "[" + mes.getRoomName() + "] " + mes.getMessage());
       }
       
       // nach unten scrollen
       this.textAreaProtokoll.setCaretPosition(this.textAreaProtokoll.getText().length());
       
    }
    
    public void DekrementUserCountInRoom(String roomname) { //Wert in textFieldRaumAnzahlBenutzer um eins vermindern, falls raum ausgewählt ist
        if(listRäume.getSelectedValue() == null) {
            return;
        }
        if(((String)listRäume.getSelectedValue()).compareTo(roomname) == 0) { //nur wenn dieser raum gerade ausgewählt ist
            int count = Integer.parseInt(textFieldRaumAnzahlBenutzer.getText());
            textFieldRaumAnzahlBenutzer.setText(String.valueOf(--count));
        }
    }
    
    public void InkrementUserCountInRoom(String roomname) { //Wert in textFieldRaumANzahlBenutzer um eins erhöhen, falls raum ausgewählt ist
        if(listRäume.getSelectedValue() == null) {
            return;
        }
        if(((String)listRäume.getSelectedValue()).compareTo(roomname) == 0) { //nur wenn dieser raum gerade ausgewählt ist
            int count = Integer.parseInt(textFieldRaumAnzahlBenutzer.getText());
            textFieldRaumAnzahlBenutzer.setText(String.valueOf(++count));
        }
    }
    
    // -------------------------------------------------------------------------
    // Raumnamen setzen
    public void addRoomNames(ArrayList<String> names) {
        
        for (String name: names) {
            this.roomList.add(name);
             // Vektor sortieren
            Collections.sort(this.roomList, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return o1.compareTo(o2);
                }
            });
            this.listRäume.setListData(roomList);
            this.listRäume.revalidate();
        }
        
    }
    
    //</editor-fold>
    
    
    //<editor-fold defaultstate="collapsed" desc="GUI - Aktion">
    
    // -------------------------------------------------------------------------
    // User Status Aktion
    private void buttonBenutzerAktionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonBenutzerAktionActionPerformed
        switch (this.comboBoxBenutzerAktion.getSelectedItem().toString()) {

            case "Normal":
                if(server.users.getUser(listBenutzer.getSelectedValue().toString()).getUserStatus() != UserStati.normal) { //nur wenn status nicht schon vorher normal ist
                    ((User)this.listBenutzer.getSelectedValue()).setUserStatus(User.UserStati.normal, false);
                    this.setMessage(new Message(((User)this.listBenutzer.getSelectedValue()).getUserName() + " hat keinen besonderen Status mehr!", "Admin", "Server", false));
                    textFieldBenutzerStatus.setText("normal");
                } else {
                    PopUp fail = new PopUp(this, "Der Status dieses Users ist schon normal");
                }
                break;
                
            case "Verwarnen":
                if(server.users.getUser(listBenutzer.getSelectedValue().toString()).getOnline()) { //nur wenn user online ist
                    ((User)this.listBenutzer.getSelectedValue()).setUserStatus(User.UserStati.verwarnt, false);
                    this.setMessage(new Message(((User)this.listBenutzer.getSelectedValue()).getUserName() + " wurde verwarnt!", "Admin", "Server", false));
                    textFieldBenutzerStatus.setText("verwarnt");
                } else {
                    PopUp fail = new PopUp(this, "Der User ist offline und kann nicht verwarnt werden");
                }
                break;
            
            case "Trennen":
                if(server.users.getUser(listBenutzer.getSelectedValue().toString()).getOnline()) { //nur wenn user online ist
                    ((User)this.listBenutzer.getSelectedValue()).setUserStatus(User.UserStati.getrennt, false);
                    this.setMessage(new Message(((User)this.listBenutzer.getSelectedValue()).getUserName() + " wurde aus Gründen vom Server getrennt!", "Admin", "Server", false));
                    textFieldBenutzerStatus.setText("getrennt");
                } else {
                    PopUp fail = new PopUp(this, "Der User ist offline und kann nicht getrennt werden");
                }
                break;
                
            case "Blocken":
                if(server.users.getUser(listBenutzer.getSelectedValue().toString()).getUserStatus() != UserStati.geblockt) { //nur wenn status nicht schon vorher geblockt ist
                    this.setMessage(new Message(((User)this.listBenutzer.getSelectedValue()).getUserName() + " wird aus Gründen von nun an vom Server geblockt!", "Admin", "Server", false));
                    ((User)this.listBenutzer.getSelectedValue()).setUserStatus(User.UserStati.geblockt, false);
                    textFieldBenutzerStatus.setText("geblockt");
                } else {
                    PopUp fail = new PopUp(this, "Dieser User ist schon geblockt");
                }
                break;
                
        }
        
        //this.panelBenutzer.setVisible(false);
    }//GEN-LAST:event_buttonBenutzerAktionActionPerformed

    
    // -------------------------------------------------------------------------
    // Raum anlegen / umbenennen / löschen
    private void buttonRaumAktionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonRaumAktionActionPerformed
        
        // Raum erstellen
        if(radioButtonRaumErstellen.isSelected()) {
            String roomName = textFieldNeuerName.getText();
            
            if(roomName.compareTo("") == 0) { //Falls raumname leer war
                PopUp fehler = new PopUp(this , "Ein leerer Raumname ist nicht erlaubt", "Leerer Raumname");
                return;
            }
            
            // Falls Raum noch nicht existiert
            if(!server.rooms.containsRoom(roomName)) {
                server.CreateRoom(roomName);
                roomList.add(textFieldNeuerName.getText());
                listRäume.setListData(roomList);
                // Vektor sortieren
                Collections.sort(this.roomList, new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                });
                listRäume.revalidate();
                this.setMessage(new Message("Der Raum " + roomName + " wurde angelegt!", "Admin", "Server", false));
            } else {
                PopUp fehler = new PopUp(this , "Dieser Raum existiert bereits.", "Raum schon vorhanden");
            }
            
        // Raum löschen
        } else if(radioButtonRaumLöschen.isSelected()) {
        
            String roomName = listRäume.getSelectedValue().toString();
            server.DeleteRoom(roomName);
            roomList.remove(roomName);
            listRäume.setListData(roomList);
            listRäume.revalidate();
            this.setMessage(new Message("Der Raum " + roomName + " wurde gelöscht!", "Admin", "Server", false));
        
        // Raumnamen ändern
        } else if(radioButtonRaumUmbenennen.isSelected()) {
            
            String newName = textFieldNeuerName.getText();
            
            // wenn Raum noch nicht vorhanden ist
            if(!server.rooms.containsRoom(newName)) {
                String oldName = listRäume.getSelectedValue().toString();
                server.ChangeRoomName(oldName, newName);
                roomList.remove(oldName);
                roomList.add(newName);
                listRäume.setListData(roomList);
                listRäume.revalidate();
                this.setMessage(new Message("Der Raum " + oldName + " heißt jetzt " + newName + "!", "Admin", "Server", false));
            } else {
                PopUp fehler = new PopUp(this , "Der neue Raumname ist bereits vergeben", "Raumname schon vorhanden");
            }
        }
        
        textFieldNeuerName.setText("");
        this.panelRaum.setVisible(false);
    }//GEN-LAST:event_buttonRaumAktionActionPerformed
    
    //</editor-fold>
    
    
    // <editor-fold defaultstate="collapsed" desc="Event-Handler"
    
    // -------------------------------------------------------------------------
    // Raumimport
    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
        if(server.rooms.roomImport(true)) {
            this.setMessage(new Message("Räume wurden importiert", "Admin", "Server", false));
        }
        if(server.users.userImport(true)) {
            this.setMessage(new Message("Benutzer wurden importiert", "Admin", "Server", false));
        }
        this.setMessage(new Message("Server wurde gestartet", "Admin", "Server", false));
        printLeerzeile();
    }//GEN-LAST:event_formWindowOpened

    
    // -------------------------------------------------------------------------
    // Liste wechseln: Details/Aktionen ausblenden
    private void tabbedPaneRäumeBenutzerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tabbedPaneRäumeBenutzerStateChanged
        this.panelBenutzer.setVisible(false);
        this.panelRaum.setVisible(false);
        this.listBenutzer.clearSelection();
        this.listRäume.clearSelection();
        
        // Wenn es noch keinen Raum gibt, Möglichkeit zum erstellen bieten
        if (this.tabbedPaneRäumeBenutzer.getSelectedIndex() == 0 && this.roomList != null && this.roomList.isEmpty()) {
            this.panelRaum.setVisible(true);
            this.panelRaumDetails.setVisible(false);
            this.radioButtonRaumLöschen.setVisible(false);
            this.radioButtonRaumUmbenennen.setVisible(false);
        }
    }//GEN-LAST:event_tabbedPaneRäumeBenutzerStateChanged
    
    
    // -------------------------------------------------------------------------
    // Ausblenden Details/Aktionen Benutzer - Einblenden Details/Aktionen Raum
    private void listRäumeValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_listRäumeValueChanged
      if(listRäume.getSelectedIndex() != -1) {
            
            this.panelBenutzer.setVisible(false);
            this.panelRaum.setVisible(true);
            this.panelRaumDetails.setVisible(true);
            this.radioButtonRaumLöschen.setVisible(true);
            this.radioButtonRaumUmbenennen.setVisible(true);
            
            int userCount = server.rooms.getUserCount(roomList.elementAt(listRäume.getSelectedIndex()));
            textFieldRaumAnzahlBenutzer.setText(String.valueOf(userCount));
            
            this.textFieldRaumName.setText(roomList.elementAt(listRäume.getSelectedIndex()));
        }
    }//GEN-LAST:event_listRäumeValueChanged

    
    // -------------------------------------------------------------------------
    // Ausblenden Details/Aktionen Raum - Einblenden Details/Aktionen Benutzer
    private void listBenutzerValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_listBenutzerValueChanged
        if (this.listBenutzer.getSelectedValue() != null) {
            
            this.panelRaum.setVisible(false);
            this.panelBenutzer.setVisible(true);
            
            // Werte in Detail-Felder einblenden
            this.textFieldBenutzerName.setText(((User) this.listBenutzer.getSelectedValue()).getUserName());
            this.textFieldBenutzerStatus.setText(((User) this.listBenutzer.getSelectedValue()).getUserStatus().toString());
            this.textFieldBenutzerRaum.setText(((User) this.listBenutzer.getSelectedValue()).getRoomName());
        }
    }//GEN-LAST:event_listBenutzerValueChanged

    
    //wird nach auschalten des Serverfensters ausgeführt
    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        printLeerzeile();
        
        server.users.sendLogOutToAllUser(User.LogOutUser.LogoutReason.ServerClosed, false);
                
        server.rooms.roomExport();
        this.setMessage(new Message("Räume wurden exportiert", "Admin", "Server", false));
        server.users.userExport();
        this.setMessage(new Message("Benutzer wurden exportiert", "Admin", "Server", false));
                
        this.setMessage(new Message("Server wurde geschlossen", "Admin", "Server", false));
        SaveServerLog();
    }//GEN-LAST:event_formWindowClosing

    //</editor-fold>
    
    //schreibt eine leere Zeile in das ServerLog
    private void printLeerzeile() {
        if (this.textAreaProtokoll.getText().equals("")) {
            this.textAreaProtokoll.setText("\r\n");
        } else {
            this.textAreaProtokoll.append("\r\n");
        }
    }
    
    // -------------------------------------------------------------------------
    // Main-Methode
    public static void main(String args[]) {
        
        // ---------------------------------------------------------------------
        // 1. GUI initialisieren, Server starten
        final ServerGui serverGUI = new ServerGui();
        
        try {
            serverGUI.server = new Server(1234, serverGUI);
            serverGUI.server.start();
            
        } catch (IOException ex) {
            System.err.println("IOException in main: " + ex.getMessage());   //Fehlermeldung kann hier noch nicht verwendet werden
        }
        
        
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ServerGui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                serverGUI.setVisible(true);
            }
        });
        
    }
    
    
    // -------------------------------------------------------------------------
    // ServerLog schreiben
    private void SaveServerLog() {
        FileWriter writer = null;
        try {
            writer = new FileWriter(System.getProperty("user.dir")+"\\Data\\log.txt", true);
            
            writer.write("-------------- Log Begin (" + new SimpleDateFormat("dd.MM.-HH:mm").format(new Date()) + ")--------------" + "\r\n");
            
            String text = textAreaProtokoll.getText();
            text = text.replaceAll("\n", "\r\n");
            writer.write(text);
            
            writer.write("\r\n" + "-------------- Log End (" + new SimpleDateFormat("dd.MM.-HH:mm").format(new Date()) + ")--------------" + "\r\n\r\n");
        } catch (IOException ex) {
            PopUp fail = new PopUp(this, "IOException : " + ex.getMessage(), "Fehler in SaveServerLog", PopUp.MessageTyp.Error);
        } finally {
            try {
                writer.close();
            } catch (IOException ex) {
                PopUp fail = new PopUp(this, "IOException2 : " + ex.getMessage(), "Fehler in SaveServerLog", PopUp.MessageTyp.Error);
            }
        }
    }
    
    
    //<editor-fold defaultstate="collapsed" desc="Generated Code" 
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton buttonBenutzerAktion;
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.ButtonGroup buttonGroup2;
    private javax.swing.ButtonGroup buttonGroup3;
    private javax.swing.ButtonGroup buttonGroup4;
    private javax.swing.ButtonGroup buttonGroup5;
    private javax.swing.ButtonGroup buttonGroup6;
    private javax.swing.JButton buttonRaumAktion;
    private javax.swing.JComboBox comboBoxBenutzerAktion;
    private java.awt.Label labelBenutzerName;
    private java.awt.Label labelBenutzerRaum;
    private java.awt.Label labelBenutzerStatus;
    private javax.swing.JLabel labelRaumAnzahlBenutzer;
    private java.awt.Label labelRaumName;
    private javax.swing.JLabel labelRaumNeuerName;
    private javax.swing.JList listBenutzer;
    private javax.swing.JList listRäume;
    private javax.swing.JPanel panelBenutzer;
    private javax.swing.JPanel panelBenutzerAktion;
    private javax.swing.JPanel panelBenutzerDetails;
    private javax.swing.JPanel panelRaum;
    private javax.swing.JPanel panelRaumAktion;
    private javax.swing.JPanel panelRaumDetails;
    private javax.swing.JRadioButton radioButtonRaumErstellen;
    private javax.swing.JRadioButton radioButtonRaumLöschen;
    private javax.swing.JRadioButton radioButtonRaumUmbenennen;
    private javax.swing.JScrollPane scrollPaneBenutzer;
    private javax.swing.JScrollPane scrollPaneProtokoll;
    private javax.swing.JScrollPane scrollPaneRäume;
    private javax.swing.JTabbedPane tabbedPaneRäumeBenutzer;
    private javax.swing.JTextArea textAreaProtokoll;
    private java.awt.TextField textFieldBenutzerName;
    private java.awt.TextField textFieldBenutzerRaum;
    private java.awt.TextField textFieldBenutzerStatus;
    private javax.swing.JTextField textFieldNeuerName;
    private javax.swing.JTextField textFieldRaumAnzahlBenutzer;
    private java.awt.TextField textFieldRaumName;
    // End of variables declaration//GEN-END:variables
    //</editor-fold>
    
}